package abq2.jic.jic.plugin.other.other.mob.mob;

import kd.bos.bill.AbstractMobBillPlugIn;
import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.operate.Donothing;
import kd.bos.form.*;
import kd.bos.form.control.EntryGrid;
import kd.bos.form.events.AfterDoOperationEventArgs;
import kd.bos.form.events.BeforeDoOperationEventArgs;
import kd.bos.form.events.MessageBoxClosedEvent;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.bos.servicehelper.user.UserServiceHelper;

import java.util.Date;

// 书籍详情页面，实现借阅功能
public class BookMobBookBillPlugin extends AbstractMobBillPlugIn {



    // 在该方法中，校验所借阅书籍是否可借阅，如果不可借阅，则返回错误提示，并取消afterDoOperation的执行
    @Override
    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
        super.beforeDoOperation(args);
        Object source = args.getSource();
        if (source instanceof Donothing) {
            Donothing donothing = (Donothing) source;
            // 获取操作代码
            String operateKey = donothing.getOperateKey();
            // 如果点击的是”借阅“操作
            if ("borrow".equals(operateKey)) {
                // 书籍基础资料必须为【已审核】状态，图书才可借阅
                if (!this.getModel().getValue("status").toString().equals("C")) {
                    this.getView().showErrorNotification("书籍基础资料必须为【已审核】状态，图书才可借阅");
                    args.setCancel(true);
                    return;
                }
                // 获取单据体控件
                EntryGrid entryentity = (EntryGrid) this.getControl("kdec_detail");
                // 获取用户勾选的数据
                int[] selectRows = entryentity.getSelectRows();
                if (selectRows.length > 1) {
                    this.getView().showErrorNotification("每次只能选择一本书！");
                    args.setCancel(true);
                    return;
                } else if (selectRows.length == 0) {
                    this.getView().showErrorNotification("必须勾选一本书进行借阅！");
                    args.setCancel(true);
                    return;
                }
                // 获取单据体的DynamicObject
                DynamicObjectCollection entryEntity = (DynamicObjectCollection) this.getModel().getEntryEntity("kdec_detail");
                // 获取所选中行的数据
                DynamicObject row = entryEntity.get(selectRows[0]);
                // 获取所选中行的借阅状态
                // 如果借阅状态是null 不能借阅
                if (row.get("kdec_bd_book.kdec_billstatusfield") == null) {
                    this.getView().showErrorNotification("无法借阅，请联系管理员！");
                    args.setCancel(true);
                    return;
                }
                String status = row.get("kdec_bd_book.kdec_billstatusfield").toString();
                // 如果不是可借阅状态，不可借阅
                if (!status.equals("A")) {
                    this.getView().showErrorNotification("只有可借阅状态的书籍可以借阅！");
                    args.setCancel(true);
                    return;
                }
                // 把selectedRow放到当前页面的缓存中
                IPageCache pageCache = this.getView().getPageCache();
                pageCache.put("selectedRowIndex", String.valueOf(selectRows[0]));
            }
        }

    }

    // 在该方法中，显示确认借阅界面，点击确定时调用confirmCallBack进行借阅
    @Override
    public void afterDoOperation(AfterDoOperationEventArgs args) {
        super.afterDoOperation(args);
        String operateKey = args.getOperateKey();
        // 如果执行borrow操作
        if ("borrow".equals(operateKey)) {
            // 点击确认时执行的回调函数
            ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener("borrowConfirm", this);
            this.getView().showConfirm("是否进行借阅？", MessageBoxOptions.OKCancel, ConfirmTypes.Default, confirmCallBacks);
        }
    }


    @Override
    public void confirmCallBack(MessageBoxClosedEvent evt) {
        super.confirmCallBack(evt);
        MessageBoxResult result = evt.getResult();
        // 如果回调时机是borrowConfirm
        if ("borrowConfirm".equals(evt.getCallBackId())) {
            // 从页面缓存获取selectedRowIndex
            IPageCache pageCache = this.getView().getPageCache();
            String selectedRowIndex = pageCache.get("selectedRowIndex");
            if (selectedRowIndex == null) {
                return;
            }
            // 选中的行
            int index = Integer.parseInt(selectedRowIndex);
            DynamicObjectCollection entryEntity = this.getModel().getEntryEntity("kdec_detail");
            // 获取选中行的dynamicObject
            DynamicObject row = entryEntity.get(index);
            // 获取要借书籍的id
            DynamicObject book = (DynamicObject) row.get("kdec_bd_book");
            Object pkValue = book.getPkValue();
            // -----------------生成一张借书单并保存start-----------------
            // 第一步：生成对象
            DynamicObject record = BusinessDataServiceHelper.newDynamicObject("kdec_borrowbook");

            // 第二步：设置单据属性
            // 设置单据头属性
            record.set("kdec_borrow_num", 1);   // 借书数量
            record.set("kdec_userfield", UserServiceHelper.getCurrentUserId()); // 借书人（当前用户）
            record.set("billstatus", "B");  // 当前状态：已借出
            record.set("kdec_unitfield", 1424499846194147328l);  // 设置计量单位pkid，计量单位：本。

            // 设置单据体属性
            DynamicObjectCollection entryCollection = record.getDynamicObjectCollection("kdec_detail"); //获取单据体容器
            DynamicObject entry = new DynamicObject(entryCollection.getDynamicObjectType());    // 新增一行
            entry.set("kdec_bd_book", pkValue); //要借的书
            entry.set("kdec_borrow_date", new Date());  //借书日期（今天）
            entry.set("kdec_deadline", new Date(System.currentTimeMillis() + 60*60*24*30*1000L));   // 最晚还书日期（30天后）
            entry.set("kdec_billstatusfield", "A");  //状态：待归还
            entry.set("kdec_qtyfield", 1);  // 申请数量
            entryCollection.add(entry);

            // 第三步：保存record对象
            SaveServiceHelper.saveOperate("kdec_borrowbook", new DynamicObject[]{record}, OperateOption.create());
            // 更新书籍状态
            DynamicObject bookDynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "kdec_book_all");
            bookDynamicObject.set("kdec_billstatusfield", "C");
            SaveServiceHelper.saveOperate("kdec_book_all", new DynamicObject[]{bookDynamicObject}, OperateOption.create());

            this.getView().showSuccessNotification("借阅成功");
            this.getView().updateView(); //刷新页面
        }
    }


}
